package dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;

import bean.BiedingBean;
import bean.GebruikerBean;
import bean.VeilingBean;
import db.DBManager;
import exceptions.VeilingBestaatNietException;

/**
 * Dao voor de veiling table
 * 
 */

public class VeilingDao
{

	private DBManager manager;
	private String getVeilingenPrepare = "SELECT * FROM veilingen v JOIN gebruikers g ON v.g_id = g.g_id";
	private String getLastVeilingPrepare = "SELECT * FROM veilingen v JOIN gebruikers g ON v.g_id = g.g_id ORDER BY v_id DESC";
	private String addVeilingPrepare = "INSERT INTO veilingen (g_id,begintijd,eindtijd,titel,beschrijving,minimumbod) VALUES(?,?,?,?,?,?)";
	private String delVeilingPrepare = "DELETE FROM veilingen WHERE v_id = ?";

	private PreparedStatement getVeilingen, getVeilingenWeek, addVeiling, delVeiling, getVeiling, getVeilingGebruiker,
			getLastVeiling;

	public VeilingDao(DBManager manager)
	{
		this.manager = manager;
		try
		{
			getVeilingen = manager.getConnection().prepareStatement(getVeilingenPrepare + " ORDER BY v.v_id DESC");
			getVeilingenWeek = manager.getConnection().prepareStatement(
					getVeilingenPrepare + " WHERE v.eindtijd > CURRENT_TIMESTAMP ORDER BY v.v_id DESC");
			addVeiling = manager.getConnection().prepareStatement(addVeilingPrepare);
			delVeiling = manager.getConnection().prepareStatement(delVeilingPrepare);
			getLastVeiling = manager.getConnection().prepareStatement(getLastVeilingPrepare);
			getVeilingGebruiker = manager.getConnection().prepareStatement(
					getVeilingenPrepare + " WHERE g.g_id = ? " + " ORDER BY v.v_id DESC");
			getVeiling = manager.getConnection().prepareStatement(
					getVeilingenPrepare + " WHERE v.v_id = ?" + " ORDER BY v.v_id DESC");
			getLastVeiling.setMaxRows(1);
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}

	public VeilingBean getLastVeiling() throws VeilingBestaatNietException
	{
		VeilingBean veiling = null;
		try
		{
			ResultSet set = getLastVeiling.executeQuery();

			if (set.next())
			{
				Calendar begintijd = Calendar.getInstance();
				begintijd.setTimeInMillis(set.getTimestamp("begintijd").getTime());

				Calendar eindtijd = Calendar.getInstance();
				eindtijd.setTimeInMillis(set.getTimestamp("eindtijd").getTime());

				GebruikerBean gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"),
						set.getString("adres"), set.getString("email"), set.getString("geboortedatum"),
						set.getString("wachtwoord"));

				veiling = new VeilingBean(set.getInt("v_id"), gebruiker, begintijd, eindtijd, set.getString("titel"),
						set.getString("beschrijving"), set.getInt("minimumbod"));

				BiedingDao bDao = new BiedingDao(manager);
				BiedingBean bieding = bDao.getHoogsteBieding(veiling);

				veiling.setMaxBod(bieding);
			} else
			{
				throw new VeilingBestaatNietException();
			}

		} catch (SQLException e)
		{
			throw new VeilingBestaatNietException();
		}
		return veiling;
	}

	/**
	 * Verwijder een veiling
	 * 
	 * @param v_id
	 */
	public void delVeiling(int v_id)
	{
		try
		{
			delVeiling.setInt(1, v_id);
			delVeiling.execute();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}

	}

	/**
	 * Voeg een veiling toe
	 * 
	 * @param gebruiker
	 * @param begintijd
	 * @param eindtijd
	 * @param titel
	 * @param beschrijving
	 * @param minimumBod
	 */
	public void addVeiling(GebruikerBean gebruiker, Calendar begintijd, Calendar eindtijd, String titel,
			String beschrijving, int minimumBod)
	{
		try
		{
			addVeiling.setInt(1, gebruiker.getId());
			addVeiling.setTimestamp(2, new Timestamp(begintijd.getTimeInMillis()));
			addVeiling.setTimestamp(3, new Timestamp(eindtijd.getTimeInMillis()));
			addVeiling.setString(4, titel);
			addVeiling.setString(5, beschrijving);
			addVeiling.setInt(6, minimumBod);
			addVeiling.execute();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * haal alle veilingen van een bepaalde gebruiker op
	 * 
	 * @param gebruiker
	 * @return
	 */
	public ArrayList<VeilingBean> getVeilingGebruiker(GebruikerBean gebruiker, BiedingDao bDao)
	{
		ArrayList<VeilingBean> veilingList = new ArrayList<VeilingBean>();
		try
		{
			getVeilingGebruiker.setInt(1, gebruiker.getId());
			ResultSet set = getVeilingGebruiker.executeQuery();
			while (set.next())
			{
				Calendar begintijd = Calendar.getInstance();
				begintijd.setTimeInMillis(set.getTimestamp("begintijd").getTime());

				Calendar eindtijd = Calendar.getInstance();
				eindtijd.setTimeInMillis(set.getTimestamp("eindtijd").getTime());

				VeilingBean veiling = new VeilingBean(set.getInt("v_id"), gebruiker, begintijd, eindtijd,
						set.getString("titel"), set.getString("beschrijving"), set.getInt("minimumbod"));

				BiedingBean bieding = bDao.getHoogsteBieding(veiling);

				veiling.setMaxBod(bieding);

				veilingList.add(veiling);
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return veilingList;

	}
	/**
	 * Haal veiling met v_id = id op
	 * 
	 * @param id
	 * @return
	 * @throws VeilingBestaatNietException
	 */
	public VeilingBean getVeiling(int id, BiedingDao bDao) throws VeilingBestaatNietException
	{
		VeilingBean veiling = null;
		try
		{
			getVeiling.setInt(1, id);
			ResultSet set = getVeiling.executeQuery();

			if (set.next())
			{
				Calendar begintijd = Calendar.getInstance();
				begintijd.setTimeInMillis(set.getTimestamp("begintijd").getTime());

				Calendar eindtijd = Calendar.getInstance();
				eindtijd.setTimeInMillis(set.getTimestamp("eindtijd").getTime());

				GebruikerBean gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"),
						set.getString("adres"), set.getString("email"), set.getString("geboortedatum"),
						set.getString("wachtwoord"));

				veiling = new VeilingBean(set.getInt("v_id"), gebruiker, begintijd, eindtijd, set.getString("titel"),
						set.getString("beschrijving"), set.getInt("minimumbod"));

				BiedingBean bieding = bDao.getHoogsteBieding(veiling);

				veiling.setMaxBod(bieding);
			} else
			{
				throw new VeilingBestaatNietException();
			}

		} catch (SQLException e)
		{
			throw new VeilingBestaatNietException();
		}
		return veiling;

	}

	public ArrayList<VeilingBean> getAlleVeilingen(int max, BiedingDao bDao)
	{
		ArrayList<VeilingBean> veilingList = new ArrayList<VeilingBean>();
		try
		{
			getVeilingen.setMaxRows(max);
			ResultSet set = getVeilingen.executeQuery();;
			while (set.next())
			{
				Calendar begintijd = Calendar.getInstance();
				begintijd.setTimeInMillis(set.getTimestamp("begintijd").getTime());

				Calendar eindtijd = Calendar.getInstance();
				eindtijd.setTimeInMillis(set.getTimestamp("eindtijd").getTime());

				GebruikerBean gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"),
						set.getString("adres"), set.getString("email"), set.getString("geboortedatum"),
						set.getString("wachtwoord"));

				VeilingBean veiling = new VeilingBean(set.getInt("v_id"), gebruiker, begintijd, eindtijd,
						set.getString("titel"), set.getString("beschrijving"), set.getInt("minimumbod"));

				BiedingBean bieding = bDao.getHoogsteBieding(veiling);
				veiling.setMaxBod(bieding);

				veilingList.add(veiling);
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return veilingList;

	}

	/**
	 * 
	 * Geef alle veilingen terug, die deze week aflopen met maximum aantal max
	 * 
	 * bDao is de biedingdao die moet meegegeven worden door complicaties met de
	 * JOIN
	 * 
	 * @param max
	 * @param bDao
	 * @return
	 */
	public ArrayList<VeilingBean> getVeilingen(int max, BiedingDao bDao)
	{
		ArrayList<VeilingBean> veilingList = new ArrayList<VeilingBean>();
		try
		{
			getVeilingenWeek.setMaxRows(max);
			ResultSet set = getVeilingenWeek.executeQuery();;
			while (set.next())
			{
				Calendar begintijd = Calendar.getInstance();
				begintijd.setTimeInMillis(set.getTimestamp("begintijd").getTime());

				Calendar eindtijd = Calendar.getInstance();
				eindtijd.setTimeInMillis(set.getTimestamp("eindtijd").getTime());

				GebruikerBean gebruiker = new GebruikerBean(set.getInt("g_id"), set.getString("gnaam"),
						set.getString("adres"), set.getString("email"), set.getString("geboortedatum"),
						set.getString("wachtwoord"));

				VeilingBean veiling = new VeilingBean(set.getInt("v_id"), gebruiker, begintijd, eindtijd,
						set.getString("titel"), set.getString("beschrijving"), set.getInt("minimumbod"));

				BiedingBean bieding = bDao.getHoogsteBieding(veiling);
				veiling.setMaxBod(bieding);

				veilingList.add(veiling);
			}
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		return veilingList;

	}
}
